#ifndef CALCULATEMANAGER_H
#define CALCULATEMANAGER_H

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <thread>
#include <mutex>

#include "CxDeviceSDK.h"
#include "FIFOQueue.h"

constexpr int MAX_CHANNEL_NUMBER = 4;       // 通道数
constexpr size_t MAX_POINT_COUNT = 70000000;   // 最大储存字节数 要参考每个数据点有几个字节

constexpr int SciAcqPackageQueue_capacity = 3;    // 回调 队列容量
constexpr int WaveDataQueue_capacity = 3;		  // WaveData 队列容量
constexpr int VoltageQueue_capacity = 3;          // 电压值 队列容量

typedef struct {
	// stable
	/// <summary>
	/// 包类型
	/// </summary>
	uint8_t PackType;

	/// <summary>
	/// 板载类型
	/// </summary>
	uint32_t BoardType;

	/// <summary>
	/// 采样频率
	/// </summary>
	uint16_t SampleFrequenceMHz;

	/// <summary>
	/// 采样分辨率
	/// </summary>
	uint8_t Resolution;

	/// <summary>
	/// 通道号
	/// </summary>
	uint16_t ChannelId;

	/// <summary>
	/// 槽位号
	/// </summary>
	uint8_t SlotId;

	/// <summary>
	/// 固件版本
	/// </summary>
	//uint32_t FirmwareVersion;

	// var change 
	/// <summary>
	/// 触发号
	/// </summary>
	uint32_t TriggerId;

	/// <summary>
	/// 秒数，相对于utc的时间
	/// </summary>
	uint64_t TimestampSecond;

	/// <summary>
	/// 时间-纳秒，秒以下的计量
	/// </summary>
	uint32_t TimestampNanosecond;

	/// <summary>
	/// 8bit 补偿精细时间戳，单位根据板卡型号有所区别，例60ps
	/// </summary>
	uint8_t TimestampFine;

	/// <summary>
	/// 波形码值偏移
	/// </summary>
	int32_t ADCDigitOffset;

	/// <summary>
	/// 波形增益
	/// </summary>
	double ADCPreGain;

	/// <summary>
	/// 量程 mv
	/// </summary>
	int32_t ADCRange;

	/// <summary>
	/// ADC 精度位数
	/// </summary>
	uint8_t ADCPrecision;

	/// <summary>
	/// 波形解析方式
	/// 0 - WaveData 中连续两字节大端，
	/// 1 - 连续两字节小端， 
	/// ......
	/// 一个点的实际电压 mv = （WaveData 一个解码点 - ADCDigitOffset）* ADCRange * ADCPregain / (1 << ADCPrecision)
	/// </summary>
	uint8_t DecodeMode;

	/// <summary>
	/// 波形数据
	/// 由SDK 维护的内存，
	/// 请尽快copy走本块内存，然后处理
	/// </summary>
	//char* WaveData;
	std::unique_ptr<char[]> WaveData;  // 改为智能指针

	/// <summary>
	/// 波形数据长度
	/// </summary>
	int32_t WaveDataSize;

}WaveDataWrapper;

typedef struct {
	//double* Data;
	std::unique_ptr<double[]> Data;  // 改为智能指针
	uint32_t DataSize; // 存储实际数据大小
}VoltageDataWrapper;

// 回调 队列
//extern std::vector<std::unique_ptr<FIFOQueue<SciAcqPackage>>> SciAcqPackageQueue;
extern std::vector<std::unique_ptr<FIFOQueue<WaveDataWrapper>>> WaveDataWrapperQueue;
// 电压数据队列声明
extern std::vector<std::unique_ptr<FIFOQueue<VoltageDataWrapper>>> VoltageQueue;


// CalculateManager 类定义
class CalculateManager
{
public:
	CalculateManager();
	~CalculateManager();

	// 成员函数声明
	//void InitializeSciAcqPackageQueue();
	void InitializeWaveDataWrapperQueue();
	void InitializeVoltageQueue();

	void SetKAndB(double k, double b);
	void UseEraseBackground(bool isUse);

	void GetChannelVoltagesOrWithInterval(uint16_t chNo, uint32_t interval);

	// 启动线程
	void StartVoltageDataThreads();
	// 停止线程  
	void StopVoltageDataThreads();

private:
	bool m_useBaseData;                                        // 是否使用背景数据
	uint16_t m_baseData[MAX_CHANNEL_NUMBER];                   // 背景数据
	double m_k;                                                // 系数 k
	double m_b;                                                // 系数 b

	std::vector<std::thread> VoltageData_threads;  // 存储所有线程
	std::atomic<bool> stop_loop;  // 控制线程停止的标志
	// 辅助函数：每个线程要执行的任务
	void VoltageDataTask(int chNo);
};

extern CalculateManager calculateManager;

#endif // CALCULATEMANAGER_H
